home *** CD-ROM | disk | FTP | other *** search
/ MacFormat España 20 / macformat_20.iso / mac / Shareware / Desarrolladores / Sprite Animation Toolkit 2.3.8 / Demos / HeartQuest demo ƒ / ClutFade / fade2.c < prev    next >
Text File  |  1995-12-13  |  5KB  |  194 lines

  1. /*
  2. Based on a demo by N. Jonas Englund.
  3.  
  4. Substantially improved and altered by Ingemar Ragnemalm 1994
  5.  
  6. - Better function naming, Mac-standard
  7. - Simplified (removed unnecessary checks)
  8. - Pascal library and interface
  9. - Fade to anything, not just black
  10. - Checks color table size
  11. - Checks for CQD
  12. - Works with both Think and MetroWerks.
  13. */
  14.  
  15.  
  16. //================================= INCLUDES ====================================
  17.  
  18. #include "fade.h"
  19.  
  20. //================================= FUNCTIONS ===================================
  21.  
  22. static void CopyCluts     (GDHandle);
  23. static void CalcFade     (short, FadeValues*, RGBColor fadeTo);
  24. static void FadeOut     (short, FadeValues, RGBColor fadeTo);
  25. static void FadeIn     (short, FadeValues, RGBColor fadeTo);
  26. static void BlackOut     (RGBColor fadeTo);
  27. static void RestoreClut(void);
  28.  
  29. //================================== GLOBALS ====================================
  30.  
  31. CTabHandle     gFade,            // 'clut' to alter with fading functions
  32.             gOrig;            // 'clut' to hold a copy of original
  33. Handle        gTempH;            //  temporary handle to copy 'clut'
  34.  
  35. short        gCtSize;
  36. short        gCtSeedSave;    // Must save and restore the seed!
  37.  
  38. /********************************** fade_screen *********************************/
  39. extern
  40. pascal void FadeScreen(short speed, Boolean fadeOut, RGBColor fadeTo)
  41. {
  42.     GDHandle     oldDev, hGD;
  43.     FadeValues    rgbs;
  44.     SysEnvRec    world;
  45.     
  46.     if (noErr != SysEnvirons(1, &world)) return;
  47.     if (!world.hasColorQD) return;
  48.     
  49.     gTempH = nil;
  50.     oldDev = GetGDevice();
  51.     hGD = GetMainDevice();
  52.  
  53.     gCtSize = (*(*(*hGD)->gdPMap)->pmTable)->ctSize;    /* Yet another case where Pascal is a lot simpler.*/
  54.     if (gCtSize < 1) return; // Can't run if no CLUT!
  55.     if (gCtSize > kMaxByte) return; // We don't expect that big CLUTs!
  56.     if ((*(*hGD)->gdPMap)->pixelSize > 8) return; // ctSize isn't 100% reliable! Check pixel size too!
  57.  
  58.     SetGDevice(hGD);
  59.     
  60.     CopyCluts(hGD);
  61.     CalcFade(speed, &rgbs, fadeTo);
  62.  
  63.     if (fadeOut)
  64.         FadeOut(speed, rgbs, fadeTo);
  65.     else
  66.         FadeIn(speed, rgbs, fadeTo);
  67.  
  68.     RestoreClut();
  69.  
  70. // TEST - make sure we restore properly
  71.     if (!fadeOut) SetEntries(0,  gCtSize, (*gOrig)->ctTable);
  72.  
  73.     SetGDevice(oldDev);
  74.  
  75.     if (gTempH != nil) DisposeHandle(gTempH);
  76. }
  77. /*** fade_screen ***/
  78.  
  79.  
  80.  
  81. /*
  82. Rutiner in:
  83. FadeIn
  84. FadeInAll
  85. FadeInMain
  86. FadeOut
  87. FadeOutAll
  88. FadeOutMain
  89. */
  90.  
  91. /********************************** CopyCluts **********************************/
  92. static
  93. void CopyCluts(GDHandle hGD)
  94. {    
  95.     gFade = (*(*hGD)->gdPMap)->pmTable;
  96.     gTempH = (Handle) (*(*hGD)->gdPMap)->pmTable;
  97.     HandToHand(&gTempH);
  98.     gOrig = (CTabHandle) gTempH;
  99.     
  100.     HLock((Handle) gFade);
  101.     HLock((Handle) gOrig);
  102. }
  103.  
  104. /*********************************** CalcFade **********************************/
  105. static
  106. void CalcFade(short speed, FadeValues *rgbs, RGBColor fadeTo)
  107. {
  108.     short    i;
  109.     
  110.     for (i = 0; i <= gCtSize; i++)
  111.     {
  112.         rgbs->reds[i]   = ((long)(*gFade)->ctTable[i].rgb.red - (long)fadeTo.red)   / speed;
  113.         rgbs->greens[i] = ((long)(*gFade)->ctTable[i].rgb.green - (long)fadeTo.green) / speed;
  114.         rgbs->blues[i]  = ((long)(*gFade)->ctTable[i].rgb.blue - (long)fadeTo.blue)  / speed;
  115.     }
  116. }
  117.  
  118. /*********************************** FadeOut ***********************************/
  119. static
  120. void FadeOut(short speed, FadeValues rgbs, RGBColor fadeTo)
  121. {
  122.     short     i, j;
  123.     
  124.     gCtSeedSave = (*gFade)->ctSeed;        // Save!
  125.     
  126.     for (j = speed; j > 0; j--)
  127.     {
  128.         for (i = 0; i <= gCtSize; i++)
  129.         {
  130.             (*gFade)->ctTable[i].rgb.red   -= rgbs.reds[i];
  131.             (*gFade)->ctTable[i].rgb.green   -= rgbs.greens[i];
  132.             (*gFade)->ctTable[i].rgb.blue   -= rgbs.blues[i];
  133.         }
  134.         SetEntries(0,  gCtSize, (*gFade)->ctTable);
  135.     }
  136.     BlackOut(fadeTo);
  137. }
  138.  
  139. /************************************ FadeIn ***********************************/
  140. static
  141. void FadeIn(short speed, FadeValues rgbs, RGBColor fadeTo)
  142. {
  143.     short     i, j;
  144.     
  145.     BlackOut(fadeTo);
  146.  
  147.     for (j = 0; j < speed; j++)
  148.     {
  149.         for (i = 0; i <= gCtSize; i++)
  150.         {
  151.             (*gFade)->ctTable[i].rgb.red   += rgbs.reds[i];
  152.             (*gFade)->ctTable[i].rgb.green   += rgbs.greens[i];
  153.             (*gFade)->ctTable[i].rgb.blue   += rgbs.blues[i];
  154.         }
  155.         SetEntries(0, gCtSize, (*gFade)->ctTable);
  156.     }
  157.  
  158.     (*gFade)->ctSeed = gCtSeedSave;        // Restore!
  159. }
  160.  
  161. /*********************************** BlackOut **********************************/
  162. static
  163. void BlackOut(RGBColor fadeTo)
  164. {
  165.     short     i;
  166.     
  167.     for (i = 0; i <= gCtSize; i++)
  168.     {
  169.         (*gFade)->ctTable[i].rgb.red   = fadeTo.red;
  170.         (*gFade)->ctTable[i].rgb.green = fadeTo.green;
  171.         (*gFade)->ctTable[i].rgb.blue  = fadeTo.blue;
  172.     }
  173.     SetEntries(0, gCtSize, (*gFade)->ctTable);
  174. }
  175.  
  176. /********************************** RestoreClut ********************************/
  177. static
  178. void RestoreClut(void)
  179. {
  180.     short     i;
  181.     
  182.     for (i = 0; i <= gCtSize; i++)
  183.     {
  184.         (*gFade)->ctTable[i].rgb.red   = (*gOrig)->ctTable[i].rgb.red;
  185.         (*gFade)->ctTable[i].rgb.green = (*gOrig)->ctTable[i].rgb.green;
  186.         (*gFade)->ctTable[i].rgb.blue  = (*gOrig)->ctTable[i].rgb.blue;
  187.     }
  188.     (*gFade)->ctSeed = GetCTSeed();
  189.     MakeITable(nil, nil, 0);
  190.     
  191.     HUnlock((Handle) gFade);
  192.     HUnlock((Handle) gOrig);
  193. }
  194.